/*********************************************************
 * 初学之家(http://www.g2room.com)，提供Java、Javascript（js）、Jquery、
 * 等一些工具或常用功能的实现例子代码，希望能给初学者提供学习和工作上的帮助，
 * 也希望有想提供源代码的朋友能联系我，一起努力，提供更多、更全面、更详细的
 * 一些初学代码例子及经验，帮助更多的人。
 * 
 * 我的联系方式：E-Mail：g2room@163.com
 * 网址：http://www.g2room.com
 * QQ：天涯（1173930590）
 * QQ交流群：323642758
 * 
 * 本站内容为提供各种java、javascript(JS)常用的工具源代码、实例（示例）、
 * 基本配置、教程、手册等；目前Java代码提供的工具（或转换）例子代码如下：
 * BASE64转换工具、bytes相关操作、email收发、文件操作（读写、拷贝、遍历、
 * 多线程copy等）、json格式转换、日志（Log4j）操作工具、Lucene搜索引擎的
 * 创建索引和搜索、各种不同Map的使用、定时器（Quartz）的使用例子、Socket的
 * 连接传输数据例子、WebService的例子及一些常用的工具类如String、Date及
 * JDK自带的一些工具类及函数的使用例子。
 * 
 * 说明：如需直接使用本站的例子代码，请保留此说明
 * 
 ********************************************************/
package com.g2room.date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.g2room.utils.DateUtil;

/**
 * 
 * 
 * @createTime: Dec 3, 2013 5:45:05 PM
 * @author: <a href="mailto:g2room@163.com">天涯</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime:
 * @updateAuthor: <a href="mailto:g2room@163.com">天涯</a>
 * @changesSum:
 * 
 */
public class DateUtils {
	/** 配置文件中从数据库中取多少天内数据 */
	private static int DAYS_AGO = 7;
	/** 配置文件中从搜索引擎中取几个月内数据 */
	private static int MONTH_AGO = 3;
	/** 数据库类型，取值为1 */
	protected static final int DB_TYPE = 1;
	/** Lucene类型，取值为2 */
	protected static final int LUCENE_TYPE = 2;
	protected static final String JSON_SUCCESS = "{message: 'SUCCESS'}";
	public static final String timeFormat = "yyyyMMddHHmmss";
	// 标记是否需要从Lucene获取数据
	// 为true则，需要从Lucene获取数据，为false则不需要
	protected static boolean searchFromLucene = true;
	// 标记是否需要从数据库获取数据
	protected static boolean searchFromDb = true;
	
	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
//		cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)
//				- daysAgo);
		boolean createFullIndex = (cal.get(Calendar.DAY_OF_MONTH) == 7);
		System.out.println(createFullIndex);
	}

	/**
	 * 返回日期格式(yyyy-MM-dd HH:mm:ss)
	 * 
	 * @param date
	 * @return
	 */
	public static String date2String(Date date) {
		return null == date ? null
				: new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
	}

	public static Calendar getDaysAgo() {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -7);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal;
	}
	
	/**
	 * 设置request的参数值到参数Map中
	 * @param type 类型：1为db参数，2或其他为lucene
	 */
	private Map<String, String> getParameters(int type) {
		Map<String, String> paraMap = new HashMap<String, String>();
		
		paraMap.put(type == DB_TYPE ? "sp_id" : "spId", "02");
//		paraMap.put(type == DB_TYPE ? "transaction_id" : "transactionId", headerTransaction);
//		paraMap.put("operStartTime", "2013-08-03 01:12:02");
//		paraMap.put("operEndTime", "2013-12-06 10:00:01");
		// 搜索引擎中搜索全部
		if(type == LUCENE_TYPE && paraMap.size() == 0) {
			// 可作为全部变量
			paraMap.put("a", "0");
		}
		return paraMap;
	}

	/**
	 * 
	 * 判断从何处获取数据，及获取数据的时间段
	 * 
	 * @param dbParaMap 数据库参数列表
	 * @param luceneParaMap Lucene参数列表
	 * @param fromKey 开始时间Map中的Key值
	 * @param toKey 结束时间Map中的Key值
	 * @throws ParseException
	 */
	public List<Map<String, String>> judgeDataFrom(
			Map<String, String> dbParaMap, Map<String, String> luceneParaMap,
			String fromKey, String toKey) throws ParseException {
		List<Map<String, String>> paraList = null;
		Date daysAgo = getDaysAgo(DB_TYPE).getTime();
		// 获取3个月内的数据
		Date monthsAgo = getDaysAgo(LUCENE_TYPE).getTime();
		Date to = null;
		if(null != luceneParaMap.get(toKey)) {
			to = DateUtil.string2Date(luceneParaMap.get(toKey), "yyyy-MM-dd HH:mm:ss");
		}
		Date from = null;
		if(null != luceneParaMap.get(fromKey)) {
			from = DateUtil.string2Date(luceneParaMap.get(fromKey), "yyyy-MM-dd HH:mm:ss");
		}
		if (null == from || from.compareTo(monthsAgo) < 0) {
			from = monthsAgo;
		}
		// 截止日期在三个月以外，直接返回Null
		if(null != to && to.compareTo(monthsAgo) < 0) {
			return paraList;
		}
		if(to == null) {
			// 如果From时间在7天以内，全部从数据库中获取
			if(daysAgo.compareTo(from) <= 0) {
				searchFromLucene = false;
				dbParaMap.put(fromKey, DateUtil.date2String(from, timeFormat));
			} else {
				luceneParaMap.put(toKey, DateUtil.date2String(daysAgo, null));
				dbParaMap.put(fromKey, DateUtil.date2String(daysAgo, timeFormat));
				luceneParaMap.put(fromKey, DateUtil.date2String(from, null));
			}
		} else {
			if (from.compareTo(to) > 0) {
				return paraList;
			} else if (daysAgo.compareTo(from) <= 0) {
				// 7天内数据，从数据库获取数据
				dbParaMap.put(fromKey, DateUtil.date2String(from, timeFormat));
				dbParaMap.put(toKey, DateUtil.date2String(to, timeFormat));
				searchFromLucene = false;
			} else if(daysAgo.compareTo(from) > 0 && daysAgo.compareTo(to) < 0){
				// 从数据库和搜索引擎获取数据
				dbParaMap.put(fromKey, DateUtil.date2String(daysAgo, timeFormat));
				luceneParaMap.put(toKey, DateUtil.date2String(daysAgo, "yyyy-MM-dd HH:mm:ss"));
				dbParaMap.put(toKey, DateUtil.date2String(to, timeFormat));
				luceneParaMap.put(fromKey, DateUtil.date2String(from, "yyyy-MM-dd HH:mm:ss"));
			} else if(daysAgo.compareTo(to) >= 0){
				// 全部从搜索引擎获取数据
				searchFromDb = false;
				luceneParaMap.put(fromKey, DateUtil.date2String(from, "yyyy-MM-dd HH:mm:ss"));
				luceneParaMap.put(toKey, DateUtil.date2String(to, "yyyy-MM-dd HH:mm:ss"));
			}
		}
		paraList = new ArrayList<Map<String, String>>();
		paraList.add(dbParaMap);
		paraList.add(luceneParaMap);
		return paraList;
	}
	
	/**
     * 获取从数据库或lucene获取数据的开始时间
     * 
     * @param type 1表示从数据库获取的开始时间，即当前时间减去7
     * 				2表示从Lucene获取数据的开始时间，即当前时间前三个月内的数据
     * @return
     */
	protected Calendar getDaysAgo(int type) {
		Calendar cal = Calendar.getInstance();
		if(type == DB_TYPE) {
			cal.add(Calendar.DATE, -DAYS_AGO);
		} else if(type == LUCENE_TYPE) {
			cal.add(Calendar.MONTH, -MONTH_AGO);
		}
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal;
	}
	
}
